home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ShareWare OnLine 2
/
ShareWare OnLine Volume 2 (CMS Software)(1993).iso
/
archiver
/
af125.zip
/
AF.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-04-03
|
57KB
|
1,382 lines
Program AF; {Archive Finder}
{$Define Err}
{$R+}
{.$DEFINE ENGLISH}
Uses Crt,Dos{$IfDef Err},Err{$Endif};
Const motRep = {$IfDef English} 'Directory';
{$Else} 'Répertoire'; {$Endif}
motKo = {$IfDef English} 'Kb';
{$Else} 'Ko'; {$Endif}
Const PatcherIci : String[7] = 'Config:';
Const SousRepAussi : Boolean = True;
EcrireToutesA : Boolean = False;
ArchivesSeules : Boolean = False;
NomComplet : Boolean = False;
Globale : Boolean = True;
PasLesArchives : Boolean = False;
VueRapide : Boolean = False;
UniquementTot : Boolean = False;
AffTotaux : Boolean = False;
TousReps : Boolean = True;
BelleVue : Boolean = True;
UnCluster : Word = 0;
DefaultRep = '\';
DefRep : String[64] = DefaultRep;
Lecteurs : String[26] = 'CDE';
DateMini : LongInt = 0;
DateMaxi : LongInt = $7FFFFFFF;
TailleMini : LongInt = 0;
TailleMaxi : LongInt = $7FFFFFFF;
Type Fichier = Record
Nam : String[12];
Att : Byte;
Dat : LongInt;
Siz : LongInt;
End;
Const MaxFichiers = 65000 div SizeOf(Fichier);
Type FichiersT = Array[1..MaxFichiers] of Fichier;
Var Fichiers : ^FichiersT;
NbFics : Word;
Const MaxMask = 20;
Var Mask : Array[1..MaxMask] of String[128];
NbMasques : Byte;
NbArch : Word;
Ext : String[10];
RepOriginal : String;
KeepExit : Pointer;
Redirige : Boolean;
CrtS : Text;
TotalFound : LongInt;
SearchMask : String;
TotDsk,TotDskR : LongInt;
TotArc,TotArcR : LongInt;
NumA,NumD : Word;
NbArcFound : Word; {nbre d'archives trouvées par -a}
ChercheTailleClust : Boolean; {spécial quand on ne sait pas sur quel
disk sera faite la recherche}
Const Pile : Byte = 0;
Function OteBs(x:String):String;
{Supprime le \ final si ce n'est pas le rep principal qui est spécifié}
Begin
if (x<>'\') and (Length(x)>1) and (x[Length(x)]='\') then
if x[Pred(Length(x))]<>':' then dec(x[0]);
OteBs:=x;
End;
Function AjouteBs(x:String):String;
{Ajoute un \ final}
Begin
if x='' then x:='.\' else
if x[Length(x)]=':' then x:=x+'.\' else
if x[Length(x)]<>'\' then x:=x+'\';
AjouteBs:=x;
End;
Function Redir:Boolean;
{pas encore implémenté la manière parfaite de détecter la redirection,
mais je dois avoir le source quelque part...}
Var b : Array[1..256] of Byte;
Begin
Move(Mem[PrefixSeg:0],B,SizeOf(b)); Redir:=B[26]<>1;
End;
Function ClusterSize(c:Char):Word;
Type DPB = Record
Numero : Byte;
SousUnite : Byte;
OctPSect : Word;
Interleave : Byte;
SectPClust : Byte;
Reserves : Word;
NbreDeFats : Byte;
RootDir : Word;
PremSect : Word;
DernClust : Word;
SectPFat : Byte;
DataSect1 : Word;
Driver : Pointer;
Media : Byte;
Flag : Byte;
NextDPB : Pointer;
End;
Var p:^DPB;
b:Byte;
r:Registers;
Begin
b:=Byte(UpCase(c)); ClusterSize:=0;
if b in [$41..$5A] then
Begin
b:=b-$40;
With r do
Begin
Ah:=$32; Dl:=b; MsDos(r);
p:=Ptr(ds,bx);
if Al=0 then
With p^ do ClusterSize:=(1 shl SectPClust)*OctPSect;
End;
End;
End;
Function FullSize(s:LongInt):LongInt;
Var z:LongInt;
Begin
z:=0;
if UnCluster>0 then
Begin
z:=(s div UnCluster)*UnCluster;
if s mod UnCluster<>0 then z:=z+UnCluster;
End;
FullSize:=z;
End;
Procedure ProcessKey;
Var c:Char;
Begin
if Keypressed then
Begin
c:=ReadKey;
if c in [#0,'',' '] then {^S,' '=pause, #0=tche de fonction}
Begin
{$IfDef English}
Write(CrtS,'≡≡≡ P a u s e ≡≡≡ Press a key to continue');
{$Else}
Write(CrtS,'≡≡≡ P a u s e ≡≡≡ Une touche pour continuer');
{$Endif}
c:=ReadKey;
Write(CrtS,^M); ClrEol;
End;
if c in [^C,#27] then Halt;
End;
End;
Function Justify(x:String; b:Byte):String;
Var Len:Byte absolute x;
Begin
if Len>=b then Len:=b else While Len<b do x:=x+' '; Justify:=x;
End;
Function AffDate(d:DateTime):String;
Const Months : Array[0..12] of String[3]
{$IfDef English}
= ('???','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
{$Else}
= ('???','Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc');
{$Endif}
Var x,y,z:String[3];
Begin
With d do
Begin
Str(Day:2,x); Str(Year mod 100:2,z); y:=Months[Month];
End;
{$IfDef ENGLISH}
AffDate:=y+' '+x+' '+z;
{$Else}
AffDate:=x+'-'+y+'-'+z;
{$Endif}
End;
Function AffHeure(d:DateTime):String;
Var x,y:String[3];
Begin
With d do
Begin
Str(Hour,x); if Hour<10 then x:='0'+x;
Str(Min,y); if Min<10 then y:='0'+y;
End;
AffHeure:=x+':'+y;
End;
{$i C:\bp\cat\AF.INC}
Function Check(s:String):Boolean;
Var k:Byte;
Foo:Boolean;
Begin
k:=0;
Repeat
Inc(k); if Pos('.',s)=0 then s:=s+'.'; Foo:=sCheck(Mask[k],s);
Until foo or (k=NbMasques);
Check:=foo;
End;
Procedure Reverse(Var l:LongInt);
{pour les .SIT (Mac) les nombres hexa sont dans l'ordre inverse...}
{Merci à Motorola et Intel de se mettre d'accord...}
Var l1:LongInt;
Begin
l1:=((l and $FF000000) shr 24) or ((l and $00FF0000) shr 8) or
((l and $0000FF00) shl 8) or ((l and $000000FF) shl 24);
l:=l1;
End;
Function OteRep(s:String):String;
Var i:Byte;
Begin
i:=Length(s); While (i>0) and (s[i]<>'\') and (s[i]<>':') do Dec(i);
if i>0 then Delete(s,1,i);
OteRep:=s;
End;
Procedure Examine(Nom:String; Taille:LongInt);
{Examen d'une archive, quel que soit son type}
Const MaxTampon = 200;
ZooId = $FDC4A7DC;
Type ZooHdrTyp = Record
Zoo_Text : Array[1..20] of Char; { Nom du compacteur }
Zoo_Tag : LongInt; { Identifie une archive Zoo }
Zoo_Start : LongInt; { Début des données }
Zoo_Minus : LongInt; { Vérification de concordance }
Zoo_Major : Char; { Version n° }
Zoo_Minor : Char; { Sous-version n° }
End;
Label Fin; {- Oui, je sais}
Var f : File;
Tampon : Array[1..MaxTampon] of Byte;
Lu : Word;
j1,j2 : Word; { pour compter la taille du nomfic et du commentaire }
NomFic : String; { Nom du fichier }
Algo : String[5]; { Algo de compression }
PSize : LongInt; { Packed Size }
USize : LongInt; { Unpacked (real) size }
Date : DateTime; { Date du fichier }
Flusher : LongInt; { Nombre d'octets à sauter jusqu'au prochain fichier }
i : Byte;
w : Word;
Li : LongInt;
Found : Word; { Nbr de fichiers trouvés }
Count : LongInt; { Position dans le fichier }
ZooHdr : ZooHdrTyp;
PassEntry : Boolean;
NumOnLine : Byte;
SizeP,SizeU : LongInt; { Tailles totales (Packed et Unpacked) }
Cmt : Boolean; { Est-ce un commentaire ? }
d1,d2 : LongInt; {taille des Datas pour les .SIT}
TailleDisk: LongInt; {Taille sur le disque}
St : String;
KeepAttr : Word;
Begin
HighVideo;
Write(CrtS,^M);
if Redirige then ClrEol;
if ArchivesSeules and AffTotaux and not Redirige then Write(CrtS,Taille:9,' ');
if NomComplet then Write(CrtS,Nom) else Write(CrtS,'Archive '+Nom);
ClrEol; Write(CrtS,^M);
Inc(NbArch);
Found:=0; Assign(f,Nom); GetFAttr(f,KeepAttr); SetFAttr(f,0);
Reset(f,1); Lu:=0; Count:=0;
if Ext='ZOO' then
Begin
BlockRead(f,ZooHdr,SizeOf(ZooHdr),Lu);
if Lu<SizeOf(ZooHdr) then Goto Fin;
Count:=ZooHdr.Zoo_Start;
End else
if Ext='SIT' then
Begin
Count:=150; {moi non plus, je ne sais plus pourquoi}
End;
NumOnLine:=0; SizeP:=0; SizeU:=0; TailleDisk:=0;
Repeat
Seek(f,Count); PassEntry:=False; Cmt:=False;
ProcessKey;
BlockRead(f,Tampon[1],MaxTampon,Lu);
if Lu<26 then Goto Fin;
if Ext='SIT' then
Begin
Move(Tampon[3],NomFic,64);
Move(Tampon[85],USize,4); Reverse(USize);
Move(Tampon[93],PSize,4); Reverse(PSize);
Move(Tampon[89],d1,4); Reverse(d1);
Move(Tampon[97],d2,4); Reverse(d2);
PSize:=PSize+d2; USize:=USize+d1;
if Tampon[1]=0 then i:=Tampon[2] else i:=Tampon[1];
Case i of
0: Algo:='Stord';
2: Algo:=' LZW ';
else Algo:='?????';
End;
Li:=0;
Flusher:=100+PSize+12; {Pourquoi 12 ? Bonne question}
End else
if Ext='ZOO' then
Begin
Move(Tampon[1],Li,4);
if Li<>ZooId then Goto Fin;
Case Tampon[6] of
0: Algo:='Store';
1: Algo:=' Lzw ';
else Begin Str(Tampon[6]:3,Algo); Algo:='? '+Algo; End;
End;
Move(Tampon[25],PSize,4);
Move(Tampon[21],USize,4);
i:=39; NomFic:='';
While Tampon[i]<>0 do Begin NomFic:=NomFic+UpCase(Chr(Tampon[i])); Inc(i); End;
Flusher:=0; Move(Tampon[7],Count,4);
Move(Tampon[15],w,2); Li:=LongInt(w) shl 16;
Move(Tampon[17],w,2); Li:=Li+w;
End else
if Ext='TPZ' then
Begin
Case Tampon[25] of
0: Algo:='inclu';
1: Algo:='implo';
End;
Move(Tampon[26],USize,4);
Move(Tampon[30],PSize,4);
NomFic:='';
i:=56;
While (Tampon[i]<>32) And (i<56+67) do
Begin
NomFic:=NomFic+UpCase(Chr(Tampon[i])); Inc(i);
End;
i:=43;
While (Tampon[i]<>32) And (i<43+12) do
Begin
NomFic:=NomFic+UpCase(Chr(Tampon[i])); Inc(i);
End;
Flusher:=PSize+122;
Move(Tampon[36],Li,4);
End else
if Ext='LZH' then
Begin
Move(Tampon[3],St[1],3); St[0]:=#3;
if St<>'-lh' then Goto Fin;
Move(Tampon[22],NomFic,Tampon[22]+1);
Algo[0]:=#5; Move(Tampon[3],Algo[1],5);
Move(Tampon[8],PSize,4);
Move(Tampon[12],USize,4);
Move(Tampon[18],w,2); Li:=LongInt(w) shl 16;
Move(Tampon[16],w,2); Li:=Li+w;
Flusher:=PSize+2+Tampon[1];
End else
if (Ext='ARJ') or ((Ext[1]='A') and (Ext[2] in ['0'..'9'])) then
Begin
Move(Tampon[17],PSize,4);
Move(Tampon[21],USize,4);
i:=35; NomFic:=''; j1:=1;
While Tampon[i]<>0 do Begin
NomFic:=NomFic+Chr(Tampon[i]); Inc(i); Inc(j1);
End;
Case Tampon[10] of
0: Algo:='Store';
else Algo:='Met.'+Chr($30+Tampon[10]);
End;
Cmt:=Tampon[11]=2;
Move(Tampon[3],w,2);
Move(Tampon[13],Li,4);
if Cmt then Begin
Flusher:=4+w+4+2;
End else Flusher:=14+w+PSize-4;
End else
if Ext='ZIP' then
Begin
Move(Tampon[1],Li,4); if Li=$02014B50 then Goto Fin;
Move(Tampon[9],w,2);
Case w of
0: Algo:='Stord';
1: Algo:='Shrun';
2: Algo:='Redu1';
3: Algo:='Redu2';
4: Algo:='Redu3';
5: Algo:='Redu4';
6: Algo:='Implo';
7: Algo:='Token';
8: Algo:='Defla'; {or EXTRA compression}
else Str(w:5,Algo);
End;
Move(Tampon[13],w,2); Li:=LongInt(w) shl 16;
Move(Tampon[11],w,2); Li:=Li+w;
Move(Tampon[19],PSize,4);
Move(Tampon[23],USize,4);
Move(Tampon[27],w,2); if w>255 then w:=255;
NomFic[0]:=Chr(w); Move(Tampon[31],NomFic[1],w);
Flusher:=30+w+PSize;
Move(Tampon[29],w,2);
Flusher:=Flusher+w;
End else
if (Ext='ARC') or (Ext='PAK') then
Begin
Case Tampon[2] of
0: Goto Fin;
1: Algo:='Stor1';
2: Algo:='Stor2';
3: Algo:='Packd';
4: Algo:='Squzd';
5: Algo:='Crun1';
6: Algo:='Crun2';
7: Algo:='Crun3';
8: Algo:='Crun4';
9: Algo:='Sqash';
else Algo:=' ? ';
End;
i:=3; NomFic:='';
While Tampon[i]<>0 do Begin NomFic:=NomFic+Chr(Tampon[i]); Inc(i); End;
Move(Tampon[16],PSize,4);
if Tampon[2]=1 then USize:=PSize
else Move(Tampon[26],USize,4);
if Tampon[2]=1 then Flusher:=25+PSize
else Flusher:=29+Psize;
Move(Tampon[18],Li,4);
End;
UnPackTime(Li,Date);
While Pos('/',NomFic)<>0 do NomFic[Pos('/',NomFic)]:='\';
if (Li>=DateMini) and (Li and $FFFF0000<=DateMaxi) and
(USize>=TailleMini) and (USize<=TailleMaxi) then
if (NomFic<>'') and not Cmt then if Check(OteRep(NomFic)) then
Begin
if Found=0 then
Begin
if Redirige and (ArchivesSeules or not EcrireToutesA) then
if NomComplet then WriteLn(Nom)
else WriteLn('Archive '+Nom);
if not Redirige then Begin LowVideo; WriteLn(CrtS); End;
if not (VueRapide or UniquementTot or NomComplet or ArchivesSeules) then
Begin
{$IfDef English}
WriteLn('File name Methd UnpSize PakSize Prct Date Time ');
{$Else}
WriteLn('Nom du fichier Méthd TRéelle TComprs Prct Date Heure');
{$Endif}
WriteLn('------------------------------ ----- ------- ------- ---- --------- -----');
End;
End;
Inc(Found); Inc(TotalFound); Inc(SizeU,USize); Inc(SizeP,PSize);
Inc(NumA);
Inc(TotArc,USize);
Inc(TotArcR,FullSize(USize));
TailleDisk:=TailleDisk+FullSize(USize);
if not (UniquementTot or ArchivesSeules) then
if VueRapide then
Begin
Inc(NumOnLine);
While Pos('\',NomFic)<>0 do Delete(NomFic,1,Pos('\',NomFic));
Write(' '+Justify(NomFic,12));
if NumOnLine=5 then
Begin
WriteLn(' '); NumOnLine:=0;
End else Write(' ');
End else
if NomComplet
then WriteLn(NomFic)
else Begin
Write(Justify(NomFic,30),' '+Algo,USize:8,' ',PSize:8,' ');
if USize>0 then Write(LongInt(PSize)*100 div USize:3,'%')
else Write('100%');
if Li<>0 then Write(' ',AffDate(Date),' ',AffHeure(Date));
WriteLn;
End;
End;
if ArchivesSeules and (found>0) then Begin
Inc(NbArcFound); Goto Fin;
End;
Inc(Count,Flusher);
Until false;
Fin: Close(f);
SetFAttr(f,KeepAttr);
if VueRapide and (NumOnLine>0) then WriteLn;
if Found>0 then if NomComplet and not ArchivesSeules then WriteLn else
if not ArchivesSeules then
if AffTotaux then
Begin
if not (VueRapide or UniquementTot) then
WriteLn('------------------------------ ------- -------');
if TailleDisk=0 then St:='' else
Begin
Str(TailleDisk,St);
St:='('+St+')';
End;
if VueRapide then i:=24 else i:=36;
if Found=1 then
{$IfDef ENGLISH}
Write(Justify('1 file '+St,i)) else
{$Else}
Write(Justify('1 fichier '+St,i)) else
{$Endif}
Begin
Str(Found,Algo);
{$IfDef ENGLISH}
Write(Justify(Algo+' files '+St,i));
{$Else}
Write(Justify(Algo+' fichiers '+St,i));
{$Endif}
End;
WriteLn(SizeU:8,' ',SizeP:8,' ',SizeP*100 div SizeU:3,'%');
WriteLn;
End else if Found>0 then WriteLn;
End;
Function WriteAttr(b:Byte):String;
Var x:String;
Begin
x:='';
if b and $1 =$1 then x:=x+'r' else x:=x+' ';
if b and $2 =$2 then x:=x+'h' else x:=x+' ';
if b and $4 =$4 then x:=x+'s' else x:=x+' ';
if b and $20=$20 then x:=x+'a' else x:=x+' ';
WriteAttr:=x;
End;
Var TmpStr : String; {Cherche est récursive !}
Dt : DateTime;
i : Word;
NumOnLine : Byte;
TotalSize : LongInt;
TotalDisk : LongInt;
St2 : String;
Procedure Cherche(Rep:ComStr);
{Recherche récursive sur les fichiers du disque.}
Type RepTypPtr = ^RepTyp;
RepTyp = Record
n:RepTypPtr; {pointe sur le prochain}
s:String[12];
End;
Var Sr:SearchRec;
FirstRep,ChnRep:RepTypPtr;
Begin
Inc(Pile);
{$i-} ChDir(Rep); {$i+}
if IoResult<>0 then
Begin
if EcrireToutesA and not NomComplet then
Begin
{$IfDef English}
TmpStr:='Invalid directory '+Rep;
{$Else}
TmpStr:='Répertoire '+Rep+' invalide';
{$Endif}
HighVideo;
if Redirige then Begin Write(TmpStr); ClrEol; WriteLn; End
else Begin
Write(CrtS,^M+TmpStr); ClrEol;
LowVideo; WriteLn(CrtS);
End;
End;
Exit;
End;
GetDir(0,TmpStr); if TmpStr[Length(TmpStr)]<>'\' then TmpStr:=TmpStr+'\';
if ChercheTailleClust then
Begin
ChercheTailleClust:=false; UnCluster:=ClusterSize(TmpStr[1]);
End;
HighVideo;
Write(CrtS,^M+motRep+' '+OteBS(TmpStr)); ClrEol; Write(CrtS,^M);
LowVideo;
NbFics:=0;
FindFirst(SearchMask,AnyFile-VolumeId,Sr); ProcessKey;
if TousReps then
Begin
New(ChnRep); FillChar(ChnRep^,Sizeof(ChnRep^),0); FirstRep:=ChnRep;
End;
if DosError=0 then
With Sr do While DosError=0 do
Begin
if Attr and Directory<>0 then
Begin
if TousReps and (Name<>'.') and (Name<>'..') then
Begin
ChnRep^.s:=Name; New(ChnRep^.n);
ChnRep:=ChnRep^.n; FillChar(ChnRep^,SizeOf(ChnRep^),0);
End;
End else
Begin
if Time<0 then Time:=0;
if Globale and (Time>=DateMini)
and (Time and $FFFF0000<=DateMaxi)
and (Size>=TailleMini)
and (Size<=TailleMaxi)
and Check(Name)
then
Begin
Inc(NbFics); Inc(TotalFound); Inc(NumD);
With Fichiers^[NbFics] do
Begin
Nam:=Name; Siz:=Size; Dat:=Time; Att:=Attr;
Inc(TotDsk,Size); Inc(TotDskR,FullSize(Size));
End;
End;
if not PasLesArchives then
Begin
if Pos('.',Name)<>0 then Ext:=Copy(Name,Pos('.',Name)+1,3)
else Ext:='';
if (Ext='LZH') or (Ext='ARJ') or (Ext='ZIP') or (Ext='ARC') or
(Ext='PAK') or (Ext='ZOO') or (Ext='SIT') or (Ext='TPZ')
or ((Ext[1]='A') and (Ext[2] in ['0'..'9']) and (Ext[3] in ['0'..'9']))
then Examine(TmpStr+Name,Size)
End;
End;
ProcessKey; FindNext(Sr);
End;
if NbFics>0 then
Begin
NumOnLine:=0; HighVideo; TotalSize:=0; TotalDisk:=0;
if BelleVue or NomComplet then Begin LowVideo; ClrEol; End else
if Redirige then Begin Write(motRep+' '+OteBs(TmpStr)); ClrEol; WriteLn; End
else Begin
Write(CrtS,^M+MotRep+' '+OteBs(TmpStr)); ClrEol;
LowVideo; WriteLn(CrtS);
End;
LowVideo;
if not (BelleVue or NomComplet or VueRapide or UniquementTot) then
Begin
{$IfDef English}
WriteLn('File name Size Date Time ');
{$Else}
WriteLn('Nom fichier Taille Date Heure');
{$Endif}
WriteLn('------------ ------- --------- -----');
End;
For i:=1 to NbFics do With Fichiers^[i] do
Begin
TotalSize:=TotalSize+Siz; TotalDisk:=TotalDisk+FullSize(Siz);
ProcessKey;
UnpackTime(Dat,DT);
if NomComplet then WriteLn(AjouteBs(OteBs(TmpStr))+Nam) else
if not UniquementTot then
if BelleVue then
WriteLn(Justify(Nam,12)+' ',Siz:8,' '+AffDate(Dt)+' '+
AffHeure(Dt)+' '+AjouteBs(OteBs(TmpStr))) else
if VueRapide then
Begin
Inc(NumOnLine);
Write(' '+Justify(Nam,12));
if NumOnLine=5 then
Begin
WriteLn; NumOnLine:=0;
End else Write(' ');
End else
WriteLn(Justify(Nam,12)+' ',Siz:8,' '+AffDate(Dt)+' '+AffHeure(Dt));
End;
if VueRapide and (NumOnLine<>0) then WriteLn;
if AffTotaux then
Begin
if not (VueRapide or UniquementTot) then
WriteLn(' -------');
if NbFics=1 then {$IfDef English}Write(Justify('1 file',13))
{$Else}Write(Justify('1 fichier',13)){$Endif}
else
Begin
Str(NbFics,St2);
{$IfDef English}
Write(Justify(St2+' files',13));
{$Else}
Write(Justify(St2+' fichiers',13));
{$Endif}
End;
WriteLn(' ',TotalSize:7,' (',TotalDisk,')');
End;
if not NomComplet then WriteLn;
End else if (not ArchivesSeules and EcrireToutesA) then
if Redirige then Writeln(motRep+' '+OteBs(TmpStr))
else Begin LowVideo; WriteLn(CrtS); End;
if SousRepAussi then
Begin
if not TousReps then
Begin
FindFirst('*.',Directory,Sr);
With Sr do While DosError=0 do
Begin
if (Attr and Directory=Directory) and (Name<>'.') and (Name<>'..') then
Cherche(Name);
FindNext(Sr);
End;
End else
if (FirstRep^.n<>Nil) or (FirstRep^.s<>'') then
Begin
ChnRep:=FirstRep;
While ChnRep<>Nil do
Begin
if ChnRep^.s<>'' then Cherche(ChnRep^.s);
FirstRep:=ChnRep; ChnRep:=ChnRep^.n; Dispose(FirstRep);
End;
End else Dispose(FirstRep);
End;
Dec(Pile); if Pile>0 then ChDir('..');
Write(CrtS,^M); ClrEol; LowVideo;
End;
Function PlusMoins(Var x:String):Byte;
{Gestion des paramètres de la ligne de commande}
Begin
Delete(x,1,1);
if x[1]='-' then Begin PlusMoins:=0; Delete(x,1,1); End else
if x[1]='+' then Begin PlusMoins:=1; Delete(x,1,1); End else
PlusMoins:=2;
End;
Function LisDate(Var s:String):LongInt;
Var Dt:DateTime;
L:LongInt;
dow:Word;
ErrVal:Integer;
Begin
Delete(s,1,1); L:=-1;
With Dt do
if Length(s)>=6 then
Begin
{$IfDef English}
Val(Copy(s,3,2),Day,ErrVal); if ErrVal<>0 then Day:=1;
Val(Copy(s,1,2),Month,ErrVal); if ErrVal<>0 then Month:=1;
{$Else}
Val(Copy(s,1,2),Day,ErrVal); if ErrVal<>0 then Day:=1;
Val(Copy(s,3,2),Month,ErrVal); if ErrVal<>0 then Month:=1;
{$Endif}
Val(Copy(s,5,2),Year,ErrVal); if ErrVal<>0 then Year:=1;
Year:=Year+1900; While Year<1980 do Inc(Year,100);
Hour:=0; Min:=0; Sec:=0;
PackTime(Dt,L); Delete(s,1,6);
End else
if (s='') or (s[1]<'0') or (s[1]>'9') then
Begin
GetDate(Year,Month,Day,Dow); Hour:=0; Min:=0; Sec:=0;
While Year<1980 do Inc(Year,100);
PackTime(Dt,l);
End else {$IfDef English}
WriteLn('/D invalid date (mmddyy)');
{$Else}
WriteLn('/D date invalide (JJMMYY)');
{$Endif}
LisDate:=L;
End;
Function ShowDate(l:LongInt):String;
Var s,x:String[6];
Dt:DateTime;
Begin
UnpackTime(l,Dt);
With Dt do Begin
s:='';
{$IfDef English}
if Month<10 then s:=s+'0'; Str(Month,x); s:=s+x;
if Day<10 then s:=s+'0'; Str(Day,x); s:=s+x;
{$Else}
if Day<10 then s:=s+'0'; Str(Day,x); s:=s+x;
if Month<10 then s:=s+'0'; Str(Month,x); s:=s+x;
{$Endif}
Year:=Year mod 100; if Year<10 then s:=s+'0'; Str(Year,x); s:=s+x;
End;
ShowDate:=s;
End;
Function LisTaille(Var x:String):LongInt;
{Extraction de la taille après /i±999}
Var s:String;
L:LongInt;
ErrVal:Integer;
Begin
Delete(x,1,1); LisTaille:=-1;
if x<>'' then
Begin
s:='';
While (x<>'') and (x[1]>='0') and (x[1]<='9') do
Begin
s:=s+x[1]; Delete(x,1,1);
End;
Val(s,L,ErrVal); if ErrVal<>0 then L:=-1;
LisTaille:=L;
End;
End;
Procedure LisParametres;
Const Pm : Array[Boolean] of Char = ('-','+');
Var Msk,Ext,x,y,z,t,Rep:String;
i,j:Byte;
Stupid,DefRepSet,AffHelp,Debug:Boolean; {Si /R a déjà été spécifié}
Begin
SearchMask:='*.*'; NbMasques:=0; DefRepSet:=False; Rep:=''; Stupid:=False;
ChercheTailleClust:=False; AffHelp:=False; Debug:=False;
if ParamCount>0 then
Begin
For i:=1 to ParamCount do
Begin
x:=ParamStr(i); For j:=1 to Length(x) do x[j]:=UpCase(x[j]);
if x[1]='?' then AffHelp:=True else
if (x[1]='/') or (x[1]='-') then
Begin
Delete(x,1,1);
While x<>'' do
Case x[1] of
'A' : Begin
Case PlusMoins(x) of
0: ArchivesSeules:=False;
1: ArchivesSeules:=True;
2: ArchivesSeules:=not ArchivesSeules;
End;
if ArchivesSeules then
Begin
EcrireToutesA:=True; Globale:=False;
End;
End;
'B' : Case PlusMoins(x) of
0: BelleVue:=False;
1: BelleVue:=True;
2: BelleVue:=not BelleVue;
End;
'C' : Begin
Case PlusMoins(x) of
0: SousRepAussi:=False;
1: SousRepAussi:=True;
2: SousRepAussi:=not SousRepAussi;
End;
if not DefRepSet then
Begin
DefRep:='';
DefRepSet:=True;
GetDir(0,y); Lecteurs:=y[1];
End;
End;
'D' : Begin
Delete(x,1,1);
Case x[1] of
'+': DateMini:=LisDate(x);
'-': DateMaxi:=LisDate(x);
'=': Begin
DateMini:=LisDate(x);
DateMaxi:=DateMini;
End;
else {$IfDef English} WriteLn('/D incorrect syntax');
{$Else} WriteLn('/D syntaxe incorrecte'); {$Endif}
End;
End;
'E' : Case PlusMoins(x) of
0: EcrireToutesA:=False;
1: EcrireToutesA:=True;
2: EcrireToutesA:=not EcrireToutesA;
End;
'F' : Case PlusMoins(x) of
0: AffTotaux:=False;
1: AffTotaux:=True;
2: AffTotaux:=not AffTotaux;
End;
'G' : Case PlusMoins(x) of
0: Globale:=False;
1: Globale:=True;
2: Globale:=not Globale;
End;
'I' : Begin
Delete(x,1,1);
Case x[1] of
'+': TailleMini:=LisTaille(x);
'-': TailleMaxi:=LisTaille(x);
'=': Begin
TailleMini:=LisTaille(x);
TailleMaxi:=TailleMini;
End;
else {$IfDef English} WriteLn('/I incorrect syntax');
{$Else} WriteLn('/I syntaxe incorrecte'); {$Endif}
End;
End;
'L' : Begin
Delete(x,1,1);
if x<>'' then
if x='0' then Begin
GetDir(0,y); Lecteurs:=y[1];
End else Lecteurs:=x;
x:='';
End;
'M' : Begin
Delete(x,1,1);
if x<>'' then
Begin
FSplit(x,y,z,t);
if y<>'' then DefRep:=OteBS(y);
if Pos(':',y)<>0 then Begin
Lecteurs:=y[1];
End;
SearchMask:=z+t; x:='';
End;
End;
'N' : Case PlusMoins(x) of
0: NomComplet:=False;
1: NomComplet:=True;
2: NomComplet:=not NomComplet;
End;
'P' : Case PlusMoins(x) of
0: PasLesArchives:=False;
1: PasLesArchives:=True;
2: PasLesArchives:=not PasLesArchives;
End;
'R' : Begin
Delete(x,1,1);
if x<>'' then
Begin
DefRep:=x; DefRepSet:=True;
if x[2]=':' then Lecteurs:=x[1];
x:='';
End;
End;
'S' : Case PlusMoins(x) of
0: SousRepAussi:=False;
1: SousRepAussi:=True;
2: SousRepAussi:=not SousRepAussi;
End;
'T' : Begin
Delete(x,1,1);
if x<>'' then
Begin
AffTotaux:=True;
if x[1]='0' then
Begin
ChercheTailleClust:=True;
Delete(x,1,1);
End else
if x[1] in ['A'..'Z'] then
Begin
UnCluster:=ClusterSize(x[1]);
Delete(x,1,1);
ChercheTailleClust:=False;
End else
if x[1]='-' then
Begin
Delete(x,1,1); ChercheTailleClust:=False;
End;
End;
End;
'U' : Case PlusMoins(x) of
0: UniquementTot:=False;
1: UniquementTot:=True;
2: UniquementTot:=not UniquementTot;
End;
'W' : Case PlusMoins(x) of
0: VueRapide:=False;
1: VueRapide:=True;
2: VueRapide:=not VueRapide;
End;
'*' : Case PlusMoins(x) of
0: TousReps:=False;
1: TousReps:=True;
2: TousReps:=not TousReps;
End;
'#' : Case PlusMoins(x) of
0: Redirige:=False;
1: Redirige:=True;
2: Redirige:=not Redirige;
End;
'?' : Begin Delete(x,1,1); AffHelp:=True; End;
')' : Begin Delete(x,1,1); Debug:=True; End;
else Delete(x,1,1);
End;
End else
Begin
{ On fait le FSplit à la main pour avoir des MASK et EXT
ayant des tailles supérieures aux normes DOS. Par
exemple: AF *LIS*MOI*.V*D* }
if x[Length(x)]=':' then x:=x+'.\'; j:=Length(x);
While (j>0) and (x[j]<>'\') and (x[j]<>':') do Dec(j);
if j>0 then
Begin
if (j>1) then Rep:=Copy(x,1,j-1) else
if j=1 then Rep:='\';
if j<>Length(x) then x:=Copy(x,j+1,Length(x)-j)
else x:='';
End;
j:=Pos('.',x);
if j>0 then
Begin
Msk:=Copy(x,1,j-1); Ext:=Copy(x,j,Length(x)-j+1);
End else
Begin
Msk:=x; Ext:='';
End;
While Pos('**',Msk)<>0 do Delete(Msk,Pos('**',Msk),1);
{ on agrandis la recherche dans la limite du raisonnable }
if (Msk[Length(Msk)]<>'*') and (Ext='') then Msk:=Msk+'*';
Msk:=Msk+Ext;
if NbMasques=MaxMask then
{$IfDef English}
WriteLn('WARNING: only ',MaxMask,' will be used !') else
{$Else}
WriteLn('ATTENTION: seulement ',MaxMask,' pris en compte !') else
{$Endif}
Begin
Inc(NbMasques); Mask[NbMasques]:=Msk;
End;
End;
End;
End;
if Globale and PasLesArchives and not DefRepSet and (Rep<>'')
then DefRep:=Rep;
if UniquementTot then
Begin
if not AffTotaux then
Begin
AffTotaux:=True; ChercheTailleClust:=True;
End;
BelleVue:=False;
End;
if (ArchivesSeules and PasLesArchives) or
(not Globale and PasLesArchives) then
Begin
Stupid:=True;
{$IfDef English}
WriteLn('What a stupid request ! Try option /)');
{$Else}
WriteLn('Quelle requête idiote ! Essayez l''option /)');
{$Endif}
End;
if ArchivesSeules then Globale:=False;
if NbMasques=0 then
Begin
Inc(NbMasques); Mask[1]:='*';
End;
if PasLesArchives and Globale and not TousReps and (NbMasques=1) then
Begin
i:=Pos('*',Mask[1]);
if (i=0) or (i<>Length(Mask[1])) or (Mask[1][Succ(i)]<>'.')
then SearchMask:=Mask[1] else TousReps:=True;
End;
if Pos('.',SearchMask)=0 then
Begin
if SearchMask[Length(SearchMask)]<>'*' then SearchMask:=SearchMask+'*';
SearchMask:=SearchMask+'.*';
End;
if DefRep[Length(DefRep)]=':' then DefRep:=DefRep+'.\';
if AffHelp or Debug then
Begin
if not Debug then
Begin
{$IfDef English}
WriteLn('Usage: AF [Mask*.*] [*Mask*] [/Parameter(s)] [-Parameter(s)]');
{$Else}
WriteLn('Usage: AF [Masque*.*] [*Masque*] [/Paramètre(s)] [-Paramètre(s)]');
{$Endif}
WriteLn;
End;
{$IfDef English}
Write(' /a '+PM[ArchivesSeules]+' Archive names only ');
Write(' /b '+PM[BelleVue]+' Beautiful vue');
WriteLn;
Write(' /c Current directory only ');
Write(' /d... Date (/d+311291 /d=010191)');
WriteLn;
Write(' /e '+PM[EcrireToutesA]+' Every name written ');
Write(' /f '+PM[AffTotaux]+' Full statistics ');
WriteLn;
Write(' /g '+PM[Globale]+' Global search ');
Write(' /i... sIze (/i+1024 /i-2048) ');
WriteLn;
Write(' /l... Look drives: '+Justify(Lecteurs,12)+' ');
Write(' /m... Mask for archives: '+Justify(SearchMask,16)+' ');
WriteLn;
Write(' /n '+PM[NomComplet]+' Names only');
WriteLn;
Write(' /p '+PM[PasLesArchives]+' skiP archives ');
Write(' /r... staRting at directory');
WriteLn;
Write(' /s '+PM[SousRepAussi]+' Subdirs also ');
Write(' /t... True size on disk');
WriteLn;
Write(' /u '+PM[UniquementTot]+' show only totals ');
Write(' /w '+PM[VueRapide]+' Wide display ');
WriteLn;
Write(' /* '+PM[TousReps]+' all directories');
{$Else}
Write(' /a '+PM[ArchivesSeules]+' noms Archives seulement ');
Write(' /b '+PM[BelleVue]+' Belle vue');
WriteLn;
Write(' /c dans Ce répertoire ');
Write(' /d... date (/d+'+ShowDate(DateMini)+' /d-'+ShowDate(DateMaxi)+')');
WriteLn;
Write(' /e '+PM[EcrireToutesA]+' tous les noms ');
Write(' /f '+PM[AffTotaux]+' aFficher les totaux ');
WriteLn;
Write(' /g '+PM[Globale]+' recherche Globale ');
Write(' /i... taille (/i+1024 /i-2048)');
WriteLn;
Write(' /l... Lecteurs: '+Justify(Lecteurs,12)+' ');
Write(' /m... Masque: '+Justify(SearchMask,16)+' ');
WriteLn;
Write(' /n '+PM[NomComplet]+' Nom complets');
WriteLn;
Write(' /p '+PM[PasLesArchives]+' Pas les archives ');
Write(' /r... Répertoire de départ');
WriteLn;
Write(' /s '+PM[SousRepAussi]+' Sous-répertoires ');
Write(' /t... Taille réelle');
WriteLn;
Write(' /u '+PM[UniquementTot]+' totaux Uniquement ');
Write(' /w '+PM[VueRapide]+' affichage ''Wide''');
WriteLn;
Write(' /* '+PM[TousReps]+' tous les répertoires');
{$Endif}
WriteLn;
if not Debug then
Begin
WriteLn;
{$Ifdef ENGLISH}
WriteLn('AF looks all over the disks through archives created by Arj, PkZip, Lha,');
WriteLn('LhArc, PkArc/PkPak, Arc, Zoo, StuffIt and Tpz for the specified masks.');
WriteLn('Exemples: AF *.DOC >MyFile.lst Result is in "MYFILE.LST"');
WriteLn(' AF *.DOC /gmFREE*.ZIP Only looks in FREE*.ZIP archives');
WriteLn(' AF *.DOC /rC:\UTIL Start searching in C:\Util');
WriteLn(' AF -cgmDOC.ZIP -tC Shows true size after unpacking on C:');
{$ELSE}
WriteLn('AF cherche sur tout le disque dans les archives créées par Arj, PkZip, Lha,');
WriteLn('LhArc, PkArc/PkPak, Arc, Zoo, StuffIt et Tpz le masque spécifié.');
WriteLn('Exemples: AF *.DOC >Fichier.lst le résultat est dans "FICHIER.LST"');
WriteLn(' AF *.DOC /gmFREE*.ZIP recherche dans les FREE*.ZIP seulement');
WriteLn(' AF *.DOC /rC:\UTIL commencer la recherche à C:\Util');
WriteLn(' AF -cgmDOC.ZIP -tC affiche la taille décompactée sur C:');
{$Endif}
End else
Begin
{$IfDef English}
Write('Mask(s): ');
{$else}
Write('Masque(s): ');
{$Endif}
For i:=1 to NbMasques do Write('»'+Justify(Mask[i],16)+'« ');
End;
Halt;
End;
if Stupid then Halt(1);
End;
{$F+} Procedure MyExitProc; {$F-}
Var c:String[1];
s:String;
Begin
LowVideo;
if Redirige or not EcrireToutesA then
Begin
Write(CrtS,^M); ClrEol;
End;
if Redirige then WriteLn(CrtS);
if AffTotaux then
if ArchivesSeules then Begin
if NbArcFound>0 then c:='s' else c:='';
{$IfDef English}
WriteLn(NbArcFound:4,' archive'+c+' found.');
{$Else}
WriteLn(NbArcFound:4,' archive'+c+' trouvée'+c+'.');
{$Endif}
End else Begin
if NumD>0 then
Begin
if NumD>1 then c:='s' else c:='';
if TotDskR>0 then Begin Str(TotDskR div 1024,s); s:='('+s+' '+MotKo+')'; End
else s:='';
{$IfDef English}
WriteLn(NumD:4,' ',Justify('file'+c+' on disk',23),TotDsk:8,' bytes ',s);
{$Else}
WriteLn(NumD:4,' ',Justify('fichier'+c+' sur le disque',23),TotDsk:8,' oct ',s);
{$Endif}
End;
if NumA>0 then
Begin
if NumA>1 then c:='s' else c:='';
if TotArcR>0 then Begin Str(TotArcR div 1024,s); s:=Justify('('+s+' '+motKo+')',10); End
else s:=' ';
{$IfDef English}
Write(NumA:4,' ',Justify('archived file'+c,23),TotArc:8,' bytes ',s,' ');
{$Else}
Write(NumA:4,' ',Justify('fichier'+c+' archivé'+c,23),TotArc:8,' oct ',s,' ');
{$endif}
if NbArch=1 then c:='' else c:='s';
Write(NbArch,' archive'+c);
WriteLn;
End;
End;
if not ArchivesSeules then if not ((NumD<>0) xor (NumA<>0)) then
Begin
if TotalFound=0 then {$IfDef English} WriteLn('No file found.') else
{$Else} WriteLn('Aucun fichier trouvé.') else {$Endif}
Begin
if TotalFound=1 then c:='' else c:='s';
{$IfDef English}
Write(TotalFound:4,' ',Justify('file'+c+' found'+c,23));
{$Else}
Write(TotalFound:4,' ',Justify('fichier'+c+' trouvé'+c,23));
{$Endif}
if AffTotaux then
Begin
if TotDskR+TotArcR>0
then Begin Str((TotDskR+TotArcR) div 1024,s); s:='('+s+' '+motKo+')'; End
else s:='';
{$IfDef English}
WriteLn(TotDsk+TotArc:8,' bytes ',s);
{$Else}
WriteLn(TotDsk+TotArc:8,' oct ',s);
{$Endif}
End;
WriteLn;
End;
End;
ChDir(RepOriginal); Close(CrtS); Dispose(Fichiers);
ExitProc:=KeepExit;
if PatcherIci='' then; {juste pour être dans le code de l'executable}
End;
Var Lec:Byte;
Begin
{$IfDef English}
WriteLn('Archive Finder 1.25 Jc Boggio/France Mar, 2 93 Public domain');
{$Else}
WriteLn('Archive Finder 1.25 Jc Boggio 2-Mar-93 Domaine public');
{$Endif}
Redirige:=Redir;
LisParametres; WriteLn; Assign(OutPut,''); ReWrite(OutPut);
AssignCrt(CrtS); ReWrite(CrtS); TotalFound:=0; New(Fichiers);
TotDsk:=0; TotDskR:=0; TotArc:=0; TotArcR:=0; NumA:=0; NumD:=0; NbArcFound:=0;
NbArch:=0; GetDir(0,RepOriginal); KeepExit:=ExitProc; ExitProc:=@MyExitProc;
if Pos(':',DefRep)<>0 then Cherche(DefRep)
else For Lec:=1 to Length(Lecteurs) do
Begin
Pile:=0; {Normalement inutile}
Cherche(Lecteurs[Lec]+':'+DefRep);
End;
End.
- 1.00 Première version.
Scrute les .LZH, les .ARJ, les .ZIP et les .ARC
- 1.01 Ajout des paramètres /S et /C
- 1.02 Ajout des fichiers .PAK
Accélération de la recherche (50% plus rapide en moyenne, très efficace
sur les grosses archives (utilisation du Seek, merci Etche)).
Gère la redirection.
Ajout du /E /M /A et /N
Amélioration de la recherche par défaut
- 1.03 Suppression du bug lorsqu'aucun paramètre n'est spécifié
Possibilité de remplacer le '/' par un '-'
Ajout du /G /P et /R
Modification du /S
- 1.04 Ajout des .ZOO (Merci Mr Burns (l'auteur de PibCat))
Ajout du /W (merci Mr Buerg (l'auteur de FV entre autres))
- 1.05 Correction de l'affichage lors d'un /G seul (sans /P)
- 1.06 Ajout de totaux sur les archives
Ajout de quelques ProcessKey pour mieux gérer <Espace>, <Ctrl-C> et <Esc>
Amélioration du /C : si un répertoire par défaut est précisé on
remplace le /C par un /S
Amélioration du /M : si le masque d'archives est précédé d'un chemin,
celui-ci est placé dans le /R
Suppression des '\' final dans les noms de répertoire (c'est plus beau)
possibilité de regrouper les paramètres (af -gp par exemple)
possibilité de spécifier la valeur + ou - d'un paramètre (af -G+S-)
Ajout de certains .SIT (très incertain !)
- 1.07 Modification mineure du /M pour raison de commodité
Ajout du /T et /F
- 1.08 Ajout du /U et du /#
Modification du /E pour inclure l'écriture des répertoires
Réparation du /R si rien n'est précisé.
Multiples modifications dans l'affichage en particulier pour la
gestion de la redirection.
- 1.09 Accélération des recherches de 28%. Quand on voit la vitesse de
"Supersonic Search Tools" on prend peur...
- 1.10 Accélération des recherches avec la recherche supersonique. 43% par
rapport à la version 1.08
Ajout du /B
- 1.11 La recherche supersonique ne pouvant chercher qu'à partir du
répertoire \ et posant un problème avec le dos 4.01, elle est
laissée de côté pour le moment.
Remis en place l'usage de ProcessKey
- 1.12 Suppression définitive de la recherche supersonique.
Suppression du /B
Amélioration de la vitesse de 20%
- 1.13 Ajout de la recherche ultra rapide utilisée par SST (l'ex référence)
qui peut ne chercher que les répertoires *.
Ici, cette fonction n'est utile qu'en conjonction avec -g et -p
(recherche globale, pas dans les archives). Mais elle est TRES utile.
SST est dépassé. Essayez AF -GP* *.ZZZ
Ajout du /*
- 1.14 Ajout des masques étendus de 4DOS ! (AF *A*F*.*)
- 1.15 Ajout de la recherche sur la date et la taille
Ajout du /D et /I
- 1.16 Correction du bug en cas de tentative d'accès à une archive ReadOnly
{Fin de la doc}
- 1.17 Correction mineure pour l'affichage des archives seules >= 10Mo.
Multi masques !!! (AF *.Zip *.doc *.pas ...)
Possibilité de lancer : AF \dos\*.com -gp
A ce stade, on ne peut plus comparer les performances avec les
autres produits (Multi masques + masques étendus)
- 1.18 Compatibilité avec MsDos 5.0 : modification de "ClusterSize".
Gère la nouvelle méthode de compression de PkZip "Extra". Bof...
- 1.19 Correction mineure pour l'affichage /Wide
Ajout du /L
Pile économisée pendant la recherche des fichiers du disque
Ajout du /B (pas la recherche supersonique mais le "Bel affichage")
Modifications diverses d'affichage des totaux.
/F détermine à présent si il faut afficher les totaux.
/G est désormais par défaut sur + !!!
Une seule diffusion
- 1.20 Encore quelques corrections et large diffusion
- 1.21 Ajout des fichiers TPZ de Patrick TEIL (merci à lui)
Amélioration de ProcessKey
Léger changement de look pour le contenu des archives
Améliorations de Check. Gains de vitesse.
Ajout de l'option /) pour VOIR ce que l'on cherche à faire et
trouver une erreur
- 1.22 Les fichiers .A00 à .A99 sont considérés comme des archives ARJ
La recherche de fichier dans une archive ne prend plus en compte
le sous-répertoire dans lequel se trouve le fichier (jusque là,
pour trouver le fichier UTIL\FICHIER.EXT, AF FICHIER* ne
fonctionnait pas. Il fallait faire AF *FICHIER*
La recherche accepte désormais les masques terminés par un . utile si
l'on cherche les fichiers ne portant pas d'extension.
- 1.23 Debug du -m qui acceptait mal les -mb:xxx
Les options /L /M et /R sont correctement affichées par l'option -)
Modifications du /a en combinaison avec un masque de fichiers et
combinaison avec /f et /n.
TRES UTILE notamment pour :
AF -AN TEASER.COM >FIC
For %a in (@FIC) do Arj d %a teaser.com
Ce petit Alias/Batch pour 4Dos fait chercher à AF toutes les
archives contenant le fichier TEASER.COM et range cette liste
dans FIC. Il ne reste plus qu'à dire à 4Dos de lire ce fichier
FIC et pour chaque nom d'archive de supprimer le fichier en question.
Correction sur le -C qui désormais fait un -L0 automatiquement
- 1.24 Création de la version en langue anglaise (non diffusée)
- 1.25 Corrections diverses langue anglaise
Meilleure gestion des "garbages" à la fin des .LZH
Changement de nom de la méthode de compactage "Deflat" pour PkZip
(anciennement "Extra compression")
Pseudo CAT sur 3614 Teaser et 3615 Legend
3614 192310084
Je cherche les formats de tous les Headers des .SIT (les vieux et les
nouveaux !) ainsi que des .CPT
Si vous avez des idées d'options à rajouter, je suis ouvert,
n'hésitez surtout pas !